package com.basker.pisces.service.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.basker.pisces.service.dto.IServiceResult;

/**
 * 服务接口自动日志注解
 * <p>
 * 这个注解是一个hint，只是标记作用
 *
 * @author hangwen
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
public @interface EnableAutoLog {

    /**
     * 日志对象的名称，为空则取当前实例的完整类名
     *
     * @return
     */
    String logName() default "";

    /**
     * 自动日志的策略
     *
     * @return
     * @see AutoLogStrategy
     */
    AutoLogStrategy[] strategy() default AutoLogStrategy.DebugAfterReturning;

    /**
     * 自动日志策略
     *
     * @author hangwen
     */
    public static enum AutoLogStrategy {

        /**
         * 不出现异常的情况下，以debug的级别记录传入的参数和返回值。如果同时配置了{@link #ErrorAfterReturning}，当{@link IServiceResult#getResult()}不等于0时，日志会重复记录。
         */
        DebugAfterReturning,

        /**
         * 返回错误结果后,即{@link IServiceResult#getResult()}不等于0,时，以error的级别记录传入的参数和返回值
         */
        ErrorAfterReturning,

        /**
         * 出现异常后，以error的级别记录传入的参数和异常
         */
        ErrorAfterThrowing

    }
}
